//
// Created by qianyi on 2023/4/28.
//

#define BZDB_STRING_MAX_LEN 255
#include <string.h>

/**
 * 取字符串子串
 * @param str
 * @param start
 * @param end
 * @param res
 */
void BzDB_string_sub(const char* str ,int start , int end, char* res)
{
    if(end == -1){
        end = strlen(str);
    }

    int temp_index = 0;
    for(int i = start ; i < end ; i++){
        res[temp_index] = str[i];
        temp_index ++;
    }
    res[temp_index] = '\0';
}

/**
 * 查找字符串出现的第一个字符
 * @param str
 * @param find
 * @param start_index
 * @return
 */
int BzDB_string_find_first(const char* str, const char* find,int start_index)
{
    if(strlen(find) > strlen(str)){
        return -1;
    }

    int len_ = strlen(str);
    int len2 = strlen(find);

    for(int i = start_index ; i < len_-len2 + 1 ; i++){
        char temp1[BZDB_STRING_MAX_LEN];
        BzDB_string_sub(str,i,i+ strlen(find),temp1);

        if(strcmp( temp1 , find ) == 0){
            return i;
        }
    }
    return -1;


}



/**
 * 查找所有的字符串，然后保存到index_list之中
 *   int index_list[5];
 *   int count = 0;
 *   BzDB_string_find_all("abc||abc||abc||abc","abc",index_list,&count);
 *   for(int i = 0 ; i < count ; i++){
 *       printf("%d\t",index_list[i]);
 *   }
 * @param str
 * @param find
 * @param index_list
 * @param index_list_len
 * @return
 */
int BzDB_string_find_all(const char* str , const char* find,int index_list[],int *index_list_len)
{
    *index_list_len = 0;
    if(strlen(find) > strlen(str)){
        return 0;
    }
    int count = 0;

    int len_str = strlen(str);
    int len_find = strlen(find);
    int i = 0;

    while ( i < len_str){

        int start = i; //起始位置
        int end = i + len_find;// 结束位置
        // 左闭右开

        if(end > len_str){
            break;
        }

        char sub_str[BZDB_STRING_MAX_LEN] = {0};
        BzDB_string_sub(str, start , end, sub_str);

        if(strcmp(sub_str , find) == 0){
            // 想等，数量+1，i后移
            index_list[*index_list_len] = i;
            *index_list_len = *index_list_len + 1;

            count = count + 1;
            i = i + len_find;
        } else{
            i = i + 1;
        }

    }
    return count;
}



long long  BzDB_string_paser_str_to_int__positive(const char* str){
    int len_ = strlen(str);

    long long res = 0;
    for(int i = 0 ; i < len_ ; i++){
        res = res*10 + (str[i] - '0') ;
    }
    return res;
}
/**
 *     int res = BzDB_string_paser_str_to_int("314");
    res = BzDB_string_paser_str_to_int("-314");
    printf("%d\n",res);
 * // 把字符串转换为int
 * @param str
 * @return
 */
long long BzDB_string_paser_str_to_int(const char* str){
    int len = strlen(str);
    if(len == 0 ){
        return 0;
    }
    if(str[0]=='-')
    {
        return -1 * BzDB_string_paser_str_to_int__positive(&str[1]);
    }
    else
    {
        return  BzDB_string_paser_str_to_int__positive(str);
    }
}


double BzDB_string_parse_str_to_double__positive(const char* str,int decimal_len){

    if(decimal_len > 15   || decimal_len < 0){
        decimal_len = 15;
    }

    int point_index = BzDB_string_find_first(str,".",0);

    // 整数部分
    char integer_part_str[20] = {0};
    // 小数部分
    char small_part_str[20] = {0};

    BzDB_string_sub(str,0,point_index,integer_part_str);
    BzDB_string_sub(str,point_index+1,-1,small_part_str);
    small_part_str[decimal_len] = '\0'; // 最多保留六位小数

    int integer_part = BzDB_string_paser_str_to_int(integer_part_str);
    int small_part = BzDB_string_paser_str_to_int(small_part_str);

    double res = 0;
    res = res+integer_part;

    int small_part_len = strlen(small_part_str);
    int ratio = 1;
    for(int i = 0 ; i < small_part_len ; i++){
        ratio = ratio * 10;
    }

    res = res + (double )small_part/ratio;

    return res;


}

/**
 *
 *     // 保留六位小数
    double pi = BzDB_string_parse_str_to_double("3.141592122",6);
    pi = BzDB_string_parse_str_to_double("-3.141592122",6);
    printf("%.10f\n",pi);
 * @param str
 * @param decimal_len 保留的小数位数
 * @return
 */
double BzDB_string_parse_str_to_double(const char* str,int decimal_len){
    int len = strlen(str);
    if(len == 0 ){
        return 0;
    }
    if(str[0]=='-')
    {
        return -1.0 * BzDB_string_parse_str_to_double__positive(&str[1],decimal_len);
    }
    else
    {
        return  BzDB_string_parse_str_to_double__positive(str,decimal_len);
    }
}

/**
 *  "0x11" -> 17
 * @param str "0x1D5" 只能大写
 * @return
 */
int BzDB_string_private_hex_to_int(char a){
    if(a <= '9'){
        return a - '0' ;
    } else{
        return a - 'A' + 10;
    }
}


/**
 * 只能是正数，
 * BzDB_string_paser_hex_str_to_int("0x1D5")
 * @param str
 * @return
 */
int BzDB_string_paser_hex_str_to_int(const char* str){

    int len_ = strlen(str);

    int res = 0;
    for(int i = 2 ; i < len_ ; i++){
        int temp = BzDB_string_private_hex_to_int(str[i]);
        res = res*16 + temp ;
    }
    return res;
}



/**
 * 字符串去掉空白字符
 * char buf1[] = {'a','b','\t','\0'}
 * @param str
 * @param res
 */
void BzDB_string_strip(const char* str, const char* res){
    int i = 0;
    for( NULL ; str[i]=='\t' || str[i] == ' ' || str[i]=='\n' || str[i] == '\r'; i++){
        NULL;
    }

    int j = strlen(str)-1;
    for( NULL ; str[j]=='\t' || str[j] == ' ' || str[j]=='\n' || str[i] == '\r' ; j--){
        NULL;
    }
    BzDB_string_sub(str,i,j+1,res);
}

/**
 *  // 字符字符串中出现多个字符
 *  BzDB_string_count("abc|abc||abc" , "abc")
 *      int cnt = BzDB_string_count("abc||abc|abc||abc" , "abc");
 * @param str
 * @param find
 * @return
 */
int BzDB_string_count(const char* str , const char* find)
{
   if(strlen(find) > strlen(str)){
       return 0;
   }
   int count = 0;

   int len_str = strlen(str);
   int len_find = strlen(find);
   int i = 0;

    while ( i < len_str){

        int start = i; //起始位置
        int end = i + len_find;// 结束位置
        // 左闭右开

        if(end > len_str){
            break;
        }

        char sub_str[BZDB_STRING_MAX_LEN] = {0};
        BzDB_string_sub(str, start , end, sub_str);

        if(strcmp(sub_str , find) == 0){
            // 想等，数量+1，i后移
            count = count + 1;
            i = i + len_find;
        } else{
            i = i + 1;
        }

    }
    return count;
}



/**
 * 将字符串数组拼接起来
    const char* msgs[] = {"hello ","the ","world"};
    char res[100] = {0};
    BzDB_string_multiple_concat(msgs,3,res);
    printf("%s\n",res);
 * @param msg_list
 * @param list_len
 * @param res
 */
void BzDB_string_multiple_concat(const char * msg_list[], int list_len , char * res)
{
    for(int i = 0 ; i < list_len ; i++)
    {
        strcat(res,msg_list[i]);
    }
}

/**
 * 注：替换的字符（str_before)长度最多254
 *     const char * str = "aaa|aaa|aaa||aaa||";
    const char* str_before = "aaa";
    const char* str_after = "eeee";
    char res[1000];
    BzDB_string_replace(str, str_before, str_after,res);
    printf("%s\n",res);
 * @param str
 * @param str_before
 * @param str_after
 * @param res
 */
void BzDB_string_replace(const char* str, const char* str_before, const char* str_after,char* res){
    int index_list[BZDB_STRING_MAX_LEN] = {0};
    int index_len = 0;
    // 查找所有下标
    BzDB_string_find_all(str,str_before,index_list,&index_len);

    // 说明没有,直接返回
    res[0] = '\0';
    if(index_len == 0){
        strcat(res,str);
        return;
    }

    char temp[BZDB_STRING_MAX_LEN] = {0};
    BzDB_string_sub(str,0,index_list[0],temp);
    strcat(res, temp );


    index_list[index_len] = -1;//-1代表最后一个
    // "aaa|bbb|ccc|aaa|bbb"
    for(int i = 0 ; i < index_len ; i++)
    {
        // 原来的字符串 index_list[i] , index_list[i]+strlen(str_before)
        // 现在的字符串 index_list[i]+strlen(str_before) ， index_list[i+1]

        int k_s = index_list[i]+strlen(str_before);
        int k_e =  index_list[i+1];

        char temp_save[BZDB_STRING_MAX_LEN] = {0};
        BzDB_string_sub(str,k_s,k_e,temp_save);

        strcat(res,str_after);
        strcat(res,temp_save);
    }
}

/**
 *
 *     const char * str = "||aaa||bbb||ccc||ddd||";
    const char * split_str = "||";
    int start_index_list[20] = {0};
    int end_index_list[20] = {0};
    int len = 0;
    BzDB_string_split(str, split_str , start_index_list,end_index_list,&len);
    for(int i = 0 ; i < len ; i++){
        char temp[255] = {0};
        BzDB_string_sub(str,start_index_list[i],end_index_list[i],temp);
        printf("%s\n",temp);
    }
 *
 * @param str
 * @param split_str
 * @param start_index_list
 * @param end_index_list
 * @param len
 */
void BzDB_string_split(const char* str, const char* split_str , int start_index_list[],int end_index_list[],int * len)
{
    *len = 0;

    int index_list[255];
    int count;
    BzDB_string_find_all(str,split_str,index_list,&count);

    index_list[count] = -1;
    count = count + 1;
    // index_list: a , b , c ,  d , -1

    // l = str(split_str)
    // start:     0       a+l     b+l       c+l       d+l
    //   end:     a       b       c         d         -1

    int l = strlen(split_str);
    for(int i = 0 ; i < count ; i++){
        if(i == 0){
            start_index_list[i] = 0;
            end_index_list[i] = index_list[i];
        }
        else if(i == count-1){
            start_index_list[i] = index_list[i-1]+l;
            end_index_list[i] = -1;
        } else{
            start_index_list[i] = index_list[i-1]+l;
            end_index_list[i] = index_list[i];
        }

    }
    *len = count;


}

/**
 *  正确返回1，错误返回0
 *  int res = BzDB_string_split_start_with("zhendeshiniya", "zhende");
    printf("%d\n",res);
 * @param str
 * @param start_str
 * @return
 */
int BzDB_string_split_start_with(const char* str, const char* start_str){
    int len_1 = strlen(str);
    int len_2 = strlen(start_str);
    if(len_1 < len_2){
        return 0;
    }

    for(int i = 0 ; i < len_2 ; i++){
        if(str[i] != start_str[i]){
            return 0;
        }
    }
    return 1;
}

/**
 * 是否以某个字符串结尾，是返回1，不是返回0
 *     int res = BzDB_string_split_end_with("aaazhangsan", "zhangsan");
    printf("%d\n",res);
 * @param str
 * @param end_str
 * @return
 */
int BzDB_string_split_end_with(const char* str, const char* end_str){
    int len_1 = strlen(str);
    int len_2 = strlen(end_str);
    if(len_1 < len_2){
        return 0;
    }

    for(int i = 0 ; i < len_2 ; i++){
        int j = len_1 - len_2 + i;
        if(str[j] != end_str[i]){
            return 0;
        }
    }
    return 1;
}







